#include <REGX51.H>
#include <absacc.h>
#include <definicje.h>
#include <prototypy.h>



// LCDRC - B AAAAAAA - pierwszy bit - busy, pozostale - adres

#define lcd_Czekaj() while(XBYTE[LCDRC]&0x80) 	//dzikie. nie da sie uzywac inline, to robie tak.
#define lcd_SprawdzLinie() lcd_Czekaj(); if(XBYTE[LCDRC] == 0x50)XBYTE[LCDWC] = 0x80; else if(XBYTE[LCDRC] == 0x10) XBYTE[LCDWC] = 0xC0;




void lcd_Init(void)
{
	lcd_Czekaj();
	XBYTE[LCDWC] = 0x38; //Function Set
	lcd_Czekaj();
	XBYTE[LCDWC] = 0x0C; //wlacza wyswietlacz, kursor nie powinien istniec
	lcd_Czekaj();
	XBYTE[LCDWC] = 0x01; //clear display
}


void lcd_PiszZnak(char a)
{
	lcd_SprawdzLinie();
	lcd_Czekaj();
	XBYTE[LCDWD] = a;
}


void lcd_PiszHex(byte a)
{	
	char b = (a >> 4) & 0x0F;
	if(b<=9) b += '0';
	else b = b + '0' + 7;	

	lcd_SprawdzLinie();
	lcd_Czekaj();
	XBYTE[LCDWD] = b;

	b = a & 0x0F;
	if(b<=9) b += '0';
	else b = b + '0' + 7;

	lcd_SprawdzLinie();
	lcd_Czekaj();
	XBYTE[LCDWD] = b;
}

void lcd_PiszCyfreHex(byte a)
{
	a &= 0x0F;
	if(a>=0x0A) a+=55;
	else a+=48;
	lcd_SprawdzLinie();
	lcd_Czekaj();
	XBYTE[LCDWD] = a;

}

void lcd_PiszInt(int a)
{
 	lcd_PiszHex(a>>8);
	lcd_PiszHex(a);
}
 

void lcd_PiszTekst(char *string)
{
	byte i;
	for(i=0;string[i] != '\0';i++)
	{
		if(string[i] == '\n')
		{
			lcd_Czekaj();
			if(XBYTE[LCDRC] <= 0x10) XBYTE[LCDWC] = 0xC0;
			else if(XBYTE[LCDRC] <= 0x50) XBYTE[LCDWC] = 0x80;
		}
		
		else
		{	
			lcd_SprawdzLinie();
			lcd_Czekaj();
			XBYTE[LCDWD] = string[i];
		}
	}
}

void lcd_Wyczysc(void)
{
	lcd_Czekaj();
	XBYTE[LCDWC] = 0x01; //clear display
}

void lcd_NowaLinia(void)
{
	lcd_Czekaj();
	if(XBYTE[LCDRC] <= 0x10) XBYTE[LCDWC] = 0xC0;
	else if(XBYTE[LCDRC] <= 0x50) XBYTE[LCDWC] = 0x80;
}

void lcd_WyczyscLinie(void)
{
	byte i;
	lcd_Czekaj();

	if(XBYTE[LCDRC] <= 0x10)
	{
		XBYTE[LCDWC] = 0x80;
		for(i=0;i!=16;i++)
		{
			lcd_Czekaj();
			XBYTE[LCDWD] = ' ';
		}
		lcd_Czekaj();
		XBYTE[LCDWC] = 0x80;
	}

	else
	{
		XBYTE[LCDWC] = 0xC0;
		for(i=0;i!=16;i++)
		{
			lcd_Czekaj();
			XBYTE[LCDWD] = ' ';
		}
		lcd_Czekaj();
		XBYTE[LCDWC] = 0xC0;
	}
}

